package com.netease.streamlearningbyjava;


import com.netease.streamlearningbyjava.bean.Employee;

import org.junit.Test;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;

/**
 * 创建日期：2021/10/29 10:11
 *
 * @author tony.sun
 * 类说明：
 * 1.创建流
 * 2.中间操作
 * 3.终止操作
 */

public class stream8ShanGuiGu {
    List<Employee> employees=Arrays.asList(
            new Employee("张三",18,9999.99),
            new Employee("李四",58,5555.55),
            new Employee("王五",26,3333.33),
            new Employee("赵六",36,6666.66),
            new Employee("田七",12,8888.88),
            new Employee("田七",12,8888.88)
    );
    public void main(String[] args) {

        //中间操作
        /**
         * 筛选与切片
         * filter--接收Lambda，从流中排除某些元素
         * limit--截断流，使其元素不超过给定数量
         * skip（n）--跳过元素，返回一个扔掉前n个元素，若流中元素不足n个，则返回一个空流，与limit（n）互补
         * distinct--筛选，通过流生成元素的hashCode()和equals（）去除重复元素
         */
//        Stream<Employee> stream = employees.stream().filter((e) -> e.getAge() > 35);//返回age大于35
        //中间操作，不会执行
        Stream<Employee> stream = employees.stream().filter((e) -> {
            System.out.println("Stream API 的中间操作");
            return e.getAge()>35;//返回age大于35的
        });
        //终止操作：一次性全部内容，即惰性求值
        stream.forEach(System.out::println);
    }
    @Test
    public void test1(){
        Iterator<Employee> it = employees.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
    //限制limit
    @Test
    public void test2(){
        employees.stream()
                .filter((e)->{
                    System.out.println("短路！");
                    return e.getSalary()>5000;
                })
                .limit(2)//执行两次
                .forEach(System.out::println);
    }
    //跳skip
    @Test
    public void test3(){
        employees.stream()
                .filter((e)->{
                    System.out.println("短路！");
                    return e.getSalary()>5000;
                })
                .skip(2)//执行了5次
                .forEach(System.out::println);
    }

    @Test
    public void test4(){
        employees.stream()
                .filter((e)->{
                    System.out.println("去重");
                    return e.getSalary()>5000;
                })
                .distinct()
                .forEach(System.out::println);
    }

}
